package com.alstudio.net.callback;

import com.alstudio.net.protocol.xmpp.data.XmppConnectionState;
import com.alstudio.net.protocol.xmpp.packact.Message;

/**
 * 此接口用于获取XMPP库相关的事件和数据
 * 
 * @author Alonso Lee
 * 
 */
public interface XmppEventListener {

	/**
	 * 连接丢失或者连接失败时，此回调将被调用
	 * 
	 * @param reason
	 *            连接丢失或者连接失败的原因
	 * @author Alonso Lee
	 */
	public void onConnectLostEvent(final String reason);

	/**
	 * 连接冲突或者连接失败时，此回调将被调用
	 * 
	 * @param reason
	 *            连接丢失原因
	 * @param conflictSid
	 *            流冲突ID
	 */
	public void onConnectLostEvent(final String reason, final String conflictSid);

	/**
	 * 登录成功后，此回调将被调用
	 * 
	 * @param jid
	 *            成功登录的jid
	 * @param pwd
	 *            jid对应的密码
	 * @author Alonso Lee
	 */
	public void onLoginedEvent(final String jid, final String pwd);

	/**
	 * 成功登出后，此回调将被执行
	 * 
	 * @author Alonso Lee
	 */
	public void onLogoutEvent();

	/**
	 * 当账号验证失败时，此回调将被执行
	 * 
	 * @author Alonso Lee
	 */
	public void onAuthFailedEvent(final String msg);

	/**
	 * 当连接IM服务器状态发生变化时，此回调将被执行
	 * 
	 * @param newState
	 *            当前状态
	 * @param oldState
	 *            上一状态
	 * @author Alonso Lee
	 */
	public void onConnectStateChangedEvent(final XmppConnectionState newState,
			final XmppConnectionState oldState);

	/**
	 * 当出现未知错误时，此回调将被执行
	 * 
	 * @param errorMessage
	 *            错误信息
	 * @author Alonso Lee
	 */
	public void onUnkonwErrorEvent(final String errorMessage);

	/**
	 * 当收到消息时，此回调将被执行
	 * 
	 * @param msg
	 */
	public void onReceiveMessage(final Message msg);

	/**
	 * 当收到消息回执时，此回调将被执行
	 * 
	 * @param from
	 * @param id
	 */
	public void onReceiveMessageBackEvent(final String from, final String id);

	
	/**
	 * @param user
	 *            更改状态的电话号码
	 * @param show
	 *            具体状态。取值范围为"online"和"offline"
	 * @param timeStamp
	 *            当show为"online"时，timeStamp为null。否则，timeStamp为离线时间
	 */
	public void onPresenceStatusEvent(final String user, final String show);
	
	
	/**
	 * 当收到服务器下发S2C或者响应C2S心跳包时，此回调将被执行。
	 * 
	 * @param c2s
	 *            true,表示服务器响应C2S心跳包;false,表示服务器下发S2C心跳包
	 * @author Alonso Lee
	 */
	public void onGetPingPackageEvent(boolean c2s);

}
